package book.book.util;

import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/*
JDBC连接工具类
 */
public class JDBCUtils {
    private static String url;
    private static String username;
    private static String password;
    private static String driver;

    //希望类被加载的时候，就能拿到配置文件中配置的信息，并给上面的属性赋值
    //在静态代码块中，编写代码，让类加载，就将信息加载
    static {
        try {
            InputStream is = JDBCUtils.class.getClassLoader()
                    .getResourceAsStream("JDBC.properties");
            Properties pro = new Properties();
            pro.load(is);
            //获取配置文件中的属性值
            url = pro.getProperty("url");
            username = pro.getProperty("username");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //注册驱动
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取Connection对象方法,不希望每次调用方法，
    // 都去传url、username、password
    //能直接获取到要连接的数据库信息，直接将连接对象返回就行
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            System.err.println("获取数据库连接异常,检查数据库连接信息");
            e.printStackTrace();
        }
        return conn;
    }
    //获取Pstmt对象,根据用户传入的sql和参数的个数，自动完成pstmt的获取和数据的绑定
    //Object...objects  可以看成是一个伪数组
    public static PreparedStatement getPstmt(Connection conn,String sql,Object...objects){
        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            //动态绑定参数
            for (int i = 1; i <= objects.length; i++) {
                pstmt.setObject(i,objects[i - 1]);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pstmt;
    }

    //close方法

    public static void close(Connection conn, Statement stmt, ResultSet rs){
        try {
            if(rs != null) rs.close();
            if(stmt != null) stmt.close();
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}
